<?php


namespace wanyue\services\sms\storage;

use TencentCloud\Sms\V20190711\Models\SendSmsRequest;
use think\Exception;
use think\facade\Config;
use wanyue\basic\BaseSms;

// 导入 SMS 模块的 client
use TencentCloud\Sms\V20190711\SmsClient;
// 导入要请求接口对应的 Request 类
use TencentCloud\Sms\V20190711\Models\AddSmsTemplateRequest;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Common\Credential;
// 导入可选配置类
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
use think\facade\Log;

/**
 * 腾讯云短信
 * Class Tencent
 * @package wanyue\services\sms\storage
 */
class Tencent extends BaseSms
{

    use \wanyue\traits\ErrorTrait;


    //API秘钥
    protected $secret_id = null;
    protected $secret_key = null;
    //应用
    protected $sdk_app_id = null;
    protected $app_key = null;
    //短信签名
    protected $signature = null;

    //短信认证实例对象
    protected $Credential = null;

    //短信http实例对象
    protected $httpProfile = null;

    public function initialize(array $config)
    {
        parent::initialize($config); // TODO: Change the autogenerated stub
        $this->parameterInitialization();
    }

    /**
     * 参数初始化
     */
    private function parameterInitialization()
    {
        $tencentParam = Config::get($this->configFile . '.stores.' . $this->name, []);

        $this->secret_id = $tencentParam['secret_id'];
        $this->secret_key = $tencentParam['secret_key'];
        $this->sdk_app_id = $tencentParam['sdk_app_id'];
        $this->app_key = $tencentParam['app_key'];
        $this->signature = $tencentParam['signature'];

        $this->Credential = new Credential($this->secret_id, $this->secret_key);
    }

    /**
     * 实例化一个 http 选项
     * @param string $reqMethod 请求方式
     * @param int $reqTimeout 请求超时时间，单位为秒
     * @param string $endPoint 指定接入地域域名（默认就近接入）
     */
    protected function httpProfile($reqMethod, $reqTimeout, $endPoint)
    {
        // 实例化一个 http 选项，可选，无特殊需求时可以跳过
        $this->httpProfile = new HttpProfile();
        $this->httpProfile->setReqMethod($reqMethod);  // 请求类型
        $this->httpProfile->setReqTimeout($reqTimeout);    // 请求超时时间，单位为秒（默认60秒）
        $this->httpProfile->setEndpoint($endPoint);  // 指定接入地域域名（默认就近接入）
    }

    /**
     * 短信发送
     * @param string $phone 下发手机号
     * @param string $templateId 模板ID
     * @param array $data 模板参数
     * @param array $http 请求参数调整
     * @param array 请求参数设置 模板参数
     * @return mixed|void
     */
    public function send(string $phone, string $templateId, array $data = [], $http = ['method' => 'GET', 'timeout' => 30, 'endPoint' => 'sms.tencentcloudapi.com'])
    {
        $this->httpProfile($http['method'], $http['timeout'], $http['endPoint']);

        // 实例化一个 client 选项
        $clientProfile = new ClientProfile();
        $clientProfile->setSignMethod("TC3-HMAC-SHA256");  // 指定签名算法（默认为 HmacSHA256）
        $clientProfile->setHttpProfile($this->httpProfile);

        // 实例化 SMS 的 client 对象，clientProfile 是可选的
        $client = new SmsClient($this->Credential, "ap-shanghai", $clientProfile);

        // 实例化一个 sms 发送短信请求对象，每个接口都会对应一个 request 对象。
        $req = new SendSmsRequest();

        /* 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID，例如1400006666 */
        $req->SmsSdkAppid = $this->sdk_app_id;
        /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，可登录 [短信控制台] 查看签名信息 */
        $req->Sign = $this->signature;//签名

        $req->TemplateID = $this->getTemplateCode($templateId);//模板id
        $req->PhoneNumberSet = array("+86$phone");//手机号
        $req->TemplateParamSet = $data;//模板参数

        // 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
        $resp = $client->SendSms($req);
        if ($resp->SendStatusSet[0]->Code !== "Ok") {
            throw new Exception($resp->SendStatusSet[0]->Message);
        }

        $resp = json_decode(json_encode($resp), true);

//        //用户保存发送记录(暂时无法获取数据)
        $resp['data'] = [];
        $resp['data']['content'] = '';
        $resp['data']['template'] = $req->TemplateID;
        $resp['data']['id'] = '';

        // 输出 JSON 格式的字符串回包
        return $resp;
    }


}